@@ -7,7 +7,9 @@ module Agents |
||
7 | 7 |
cannot_create_events! |
8 | 8 |
|
9 | 9 |
description <<-MD |
10 |
- The Email Digest Agent collects any Events sent to it and sends them all via email when scheduled. |
|
10 |
+ The Email Digest Agent collects any Events sent to it and sends them all via email when scheduled. The number of |
|
11 |
+ used events also relies on the `Keep events` option of the emitting Agent, meaning that if events expire before |
|
12 |
+ this agent is scheduled to run, they will not appear in the email. |
|
11 | 13 |
|
12 | 14 |
By default, the will have a `subject` and an optional `headline` before listing the Events. If the Events' |
13 | 15 |
payloads contain a `message`, that will be highlighted, otherwise everything in |
@@ -37,18 +39,16 @@ module Agents |
||
37 | 39 |
end |
38 | 40 |
|
39 | 41 |
def receive(incoming_events) |
42 |
+ self.memory['events'] ||= [] |
|
40 | 43 |
incoming_events.each do |event| |
41 |
- self.memory['queue'] ||= [] |
|
42 |
- self.memory['queue'] << event.payload |
|
43 |
- self.memory['events'] ||= [] |
|
44 | 44 |
self.memory['events'] << event.id |
45 | 45 |
end |
46 | 46 |
end |
47 | 47 |
|
48 | 48 |
def check |
49 |
- if self.memory['queue'] && self.memory['queue'].length > 0 |
|
50 |
- ids = self.memory['events'].join(",") |
|
51 |
- groups = self.memory['queue'].map { |payload| present(payload) } |
|
49 |
+ if self.memory['events'] && self.memory['events'].length > 0 |
|
50 |
+ payloads = received_events.reorder("events.id ASC").where(id: self.memory['events']).pluck(:payload).to_a |
|
51 |
+ groups = payloads.map { |payload| present(payload) } |
|
52 | 52 |
recipients.each do |recipient| |
53 | 53 |
begin |
54 | 54 |
SystemMailer.send_message( |
@@ -59,13 +59,13 @@ module Agents |
||
59 | 59 |
content_type: interpolated['content_type'], |
60 | 60 |
groups: groups |
61 | 61 |
).deliver_now |
62 |
- log "Sent digest mail to #{recipient} with events [#{ids}]" |
|
62 |
+ |
|
63 |
+ log "Sent digest mail to #{recipient}" |
|
63 | 64 |
rescue => e |
64 |
- error("Error sending digest mail to #{recipient} with events [#{ids}]: #{e.message}") |
|
65 |
+ error("Error sending digest mail to #{recipient}: #{e.message}") |
|
65 | 66 |
raise |
66 | 67 |
end |
67 | 68 |
end |
68 |
- self.memory['queue'] = [] |
|
69 | 69 |
self.memory['events'] = [] |
70 | 70 |
end |
71 | 71 |
end |
@@ -0,0 +1,8 @@ |
||
1 |
+class RemoveQueueFromEmailDigestAgentMemory < ActiveRecord::Migration |
|
2 |
+ def up |
|
3 |
+ Agents::EmailDigestAgent.find_each do |agent| |
|
4 |
+ agent.memory.delete("queue") |
|
5 |
+ agent.save!(validate: false) |
|
6 |
+ end |
|
7 |
+ end |
|
8 |
+end |
@@ -8,11 +8,11 @@ describe Agents::EmailDigestAgent do |
||
8 | 8 |
end |
9 | 9 |
|
10 | 10 |
before do |
11 |
- @checker = Agents::EmailDigestAgent.new(:name => "something", :options => { :expected_receive_period_in_days => "2", :subject => "something interesting" }) |
|
11 |
+ @checker = Agents::EmailDigestAgent.new(:name => "something", :options => {:expected_receive_period_in_days => "2", :subject => "something interesting"}) |
|
12 | 12 |
@checker.user = users(:bob) |
13 | 13 |
@checker.save! |
14 | 14 |
|
15 |
- @checker1 = Agents::EmailDigestAgent.new(:name => "something", :options => { :expected_receive_period_in_days => "2", :subject => "something interesting", :content_type => "text/plain" }) |
|
15 |
+ @checker1 = Agents::EmailDigestAgent.new(:name => "something", :options => {:expected_receive_period_in_days => "2", :subject => "something interesting", :content_type => "text/plain"}) |
|
16 | 16 |
@checker1.user = users(:bob) |
17 | 17 |
@checker1.save! |
18 | 18 |
end |
@@ -25,16 +25,16 @@ describe Agents::EmailDigestAgent do |
||
25 | 25 |
it "queues any payloads it receives" do |
26 | 26 |
event1 = Event.new |
27 | 27 |
event1.agent = agents(:bob_rain_notifier_agent) |
28 |
- event1.payload = { :data => "Something you should know about" } |
|
28 |
+ event1.payload = {:data => "Something you should know about"} |
|
29 | 29 |
event1.save! |
30 | 30 |
|
31 | 31 |
event2 = Event.new |
32 | 32 |
event2.agent = agents(:bob_weather_agent) |
33 |
- event2.payload = { :data => "Something else you should know about" } |
|
33 |
+ event2.payload = {:data => "Something else you should know about"} |
|
34 | 34 |
event2.save! |
35 | 35 |
|
36 | 36 |
Agents::EmailDigestAgent.async_receive(@checker.id, [event1.id, event2.id]) |
37 |
- expect(@checker.reload.memory[:queue]).to eq([{ 'data' => "Something you should know about" }, { 'data' => "Something else you should know about" }]) |
|
37 |
+ expect(@checker.reload.memory['events']).to match([event1.id, event2.id]) |
|
38 | 38 |
end |
39 | 39 |
end |
40 | 40 |
|
@@ -44,25 +44,34 @@ describe Agents::EmailDigestAgent do |
||
44 | 44 |
Agents::EmailDigestAgent.async_check(@checker.id) |
45 | 45 |
expect(ActionMailer::Base.deliveries).to eq([]) |
46 | 46 |
|
47 |
- @checker.memory[:queue] = [{ :data => "Something you should know about" }, |
|
48 |
- { :title => "Foo", :url => "http://google.com", :bar => 2 }, |
|
49 |
- { "message" => "hi", :woah => "there" }, |
|
50 |
- { "test" => 2 }] |
|
51 |
- @checker.memory[:events] = [1,2,3,4] |
|
52 |
- @checker.save! |
|
53 |
- |
|
54 |
- Agents::EmailDigestAgent.async_check(@checker.id) |
|
47 |
+ payloads = [ |
|
48 |
+ {:data => "Something you should know about"}, |
|
49 |
+ {:title => "Foo", :url => "http://google.com", :bar => 2}, |
|
50 |
+ {"message" => "hi", :woah => "there"}, |
|
51 |
+ {"test" => 2} |
|
52 |
+ ] |
|
53 |
+ |
|
54 |
+ events = payloads.map do |payload| |
|
55 |
+ Event.new.tap do |event| |
|
56 |
+ event.agent = agents(:bob_weather_agent) |
|
57 |
+ event.payload = payload |
|
58 |
+ event.save! |
|
59 |
+ end |
|
60 |
+ end |
|
61 |
+ |
|
62 |
+ Agents::DigestAgent.async_receive(@checker.id, events.map(&:id)) |
|
63 |
+ @checker.sources << agents(:bob_weather_agent) |
|
64 |
+ Agents::DigestAgent.async_check(@checker.id) |
|
55 | 65 |
|
56 | 66 |
expect(ActionMailer::Base.deliveries.last.to).to eq(["bob@example.com"]) |
57 | 67 |
expect(ActionMailer::Base.deliveries.last.subject).to eq("something interesting") |
58 | 68 |
expect(get_message_part(ActionMailer::Base.deliveries.last, /plain/).strip).to eq("Event\n data: Something you should know about\n\nFoo\n bar: 2\n url: http://google.com\n\nhi\n woah: there\n\nEvent\n test: 2") |
59 |
- expect(@checker.reload.memory[:queue]).to be_empty |
|
69 |
+ expect(@checker.reload.memory[:events]).to be_empty |
|
60 | 70 |
end |
61 | 71 |
|
62 | 72 |
it "logs and re-raises mailer errors" do |
63 | 73 |
mock(SystemMailer).send_message(anything) { raise Net::SMTPAuthenticationError.new("Wrong password") } |
64 | 74 |
|
65 |
- @checker.memory[:queue] = [{ :data => "Something you should know about" }] |
|
66 | 75 |
@checker.memory[:events] = [1] |
67 | 76 |
@checker.save! |
68 | 77 |
|
@@ -71,8 +80,6 @@ describe Agents::EmailDigestAgent do |
||
71 | 80 |
}.to raise_error(/Wrong password/) |
72 | 81 |
|
73 | 82 |
expect(@checker.reload.memory[:events]).not_to be_empty |
74 |
- expect(@checker.reload.memory[:queue]).not_to be_empty |
|
75 |
- |
|
76 | 83 |
expect(@checker.logs.last.message).to match(/Error sending digest mail .* Wrong password/) |
77 | 84 |
end |
78 | 85 |
|
@@ -84,7 +91,7 @@ describe Agents::EmailDigestAgent do |
||
84 | 91 |
Agent.async_check(agents(:bob_weather_agent).id) |
85 | 92 |
|
86 | 93 |
Agent.receive! |
87 |
- expect(@checker.reload.memory[:queue]).not_to be_empty |
|
94 |
+ expect(@checker.reload.memory[:events]).not_to be_empty |
|
88 | 95 |
|
89 | 96 |
Agents::EmailDigestAgent.async_check(@checker.id) |
90 | 97 |
|
@@ -94,18 +101,14 @@ describe Agents::EmailDigestAgent do |
||
94 | 101 |
expect(plain_email_text).to match(/avehumidity/) |
95 | 102 |
expect(html_email_text).to match(/avehumidity/) |
96 | 103 |
|
97 |
- expect(@checker.reload.memory[:queue]).to be_empty |
|
104 |
+ expect(@checker.reload.memory[:events]).to be_empty |
|
98 | 105 |
end |
99 |
- |
|
106 |
+ |
|
100 | 107 |
it "should send email with correct content type" do |
101 | 108 |
Agents::EmailDigestAgent.async_check(@checker1.id) |
102 | 109 |
expect(ActionMailer::Base.deliveries).to eq([]) |
103 | 110 |
|
104 |
- @checker1.memory[:queue] = [{ :data => "Something you should know about" }, |
|
105 |
- { :title => "Foo", :url => "http://google.com", :bar => 2 }, |
|
106 |
- { "message" => "hi", :woah => "there" }, |
|
107 |
- { "test" => 2 }] |
|
108 |
- @checker1.memory[:events] = [1,2,3,4] |
|
111 |
+ @checker1.memory[:events] = [1, 2, 3, 4] |
|
109 | 112 |
@checker1.save! |
110 | 113 |
|
111 | 114 |
Agents::EmailDigestAgent.async_check(@checker1.id) |